﻿//题目描述
//输入两个正整数 x0​, y0​，求出满足下列条件的 P, Q 的个数：P, Q 是正整数。
//要求 P, Q 以 x0​为最大公约数，以 y0​为最小公倍数。
//试求：满足条件的所有可能的 P, Q 的个数。
//输入格式
//一行两个正整数 x0​, y0​。
//输出格式
//一行一个数，表示求出满足条件的 P, Q 的个数。
//输入输出样例
//输入 
//3 60
//输出 
//4
//说明 / 提示
//P, Q 有 4 种：
//3, 60。
//15, 12。
//12, 15。
//60, 3。
//对于 100 % 的数据，2≤x0​, y0​≤10^5。
//两个数的积等于它们最大公约数和它们最小公倍数的积。公式表示为 a×b=gcd(a,b)×lcm(a,b)
//考虑优化这个程序。我们其实并不需要枚举两次，因为对于不同的 x,y ，交换它们的值一定可以得到另一组与之对应的解。
// 因此，从 1 到  P×Q​枚举一遍，每发现一组答案就将 ans 的值加上 2 即可。
//一组 x, y 有对应解时有条件：x, y 的值不同。如果它们相同，交换后并不能得到与之对应的另一组数。
// 当 x = y 时，易得 x = y = gcd(x, y) = lcm(x, y)。 所以要对此进行特判，若 P, Q 相等，这种情况就存在， ans 里要减去 1。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll m, n, ans;
ll gcd(ll x, ll y) {//辗转相除法求最大公约数
	return y == 0 ? x :gcd(y, x % y);
}
int main() {
	cin >> m >> n;
	if (m == n) ans--; // 特例处理：当x0等于y0时补偿计数
	n *= m;// 计算x0*y0
	for (long long i = 1; i <= sqrt(n); i++) {// 枚举因数
		if (n % i == 0 && gcd(i, n / i) == m) ans += 2;// 每个因数对贡献两个答案（顺序不同
	}
	cout << ans;
	return 0;
}